import P20010_识别字符串中的Word和Token
import P20020_识别字符串中的Word和Token_增加错误处理
import P20030_语法检测

def precedence(op):
    '''计算运算符的优先级，数字越大优先级越高'''
    if op in ('+', '-'):
        return 1
    if op in ('*', '/'):
        return 2
    return 0

def FormPostfix(tokens):
    '''调整计算顺序，形成后缀表达式.以列表形式的token返回
    3 * 4 + 2 / 6 - 1 调整为 3, 4, *, 2, 6, /, +, 1, -
    '''
    stack = []
    outputList = []
    for token in tokens:
        if token['type'] == 'TOKEN_TYPE_NUMBER':  #是数字类型，放入输出列表中
            outputList.append(token['word'])
        elif token['word'] in P20010_识别字符串中的Word和Token.LIST_OPERATOR: #是运算符，要判断优先级
            while stack and precedence(stack[-1]) >= precedence(token['word']):  #栈中上一个运算符比当前的运算符优先级高
                outputList.append(stack.pop()) #把上一个运算符放到输出列表中
            stack.append(token["word"])  # 入栈
    while stack: #栈中还存在运算符，则取出来放到输出列表中
        outputList.append(stack.pop())
    return outputList

def Run(TokensPostfix):
    stack = []
    for tokenPostfix in TokensPostfix:
        if tokenPostfix.isdigit(): #不计算
            stack.append(tokenPostfix)
        else: #进行计算
            b = float(stack.pop())
            a = float(stack.pop())
            match tokenPostfix:
                case '+':
                    stack.append(a + b)
                case '-':
                    stack.append(a - b)
                case '*':
                    stack.append(a * b)
                case '/':
                    stack.append(a / b)
    return(stack[0])

# 测试
print("test 1")
expression = "3 * 4 + 2 / 6 - 1"
tokens = P20020_识别字符串中的Word和Token_增加错误处理.Tokenize(expression)
P20030_语法检测.SyntaxCheck(tokens)
tokensPostfix = FormPostfix(tokens)
print("The resulst is: %s" % Run(tokensPostfix))


